﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate.Mapping.Attributes;
using System.Runtime.Serialization;

namespace VemTransporte.Models.Basica
{
    [DataContract]
    [KnownType(typeof(Linha))]
    [Class(Table="Linha")]
    public class Linha
    {
        #region Atributos
        private int id = 0;
        private string numero;
        private string nome;
        private IList<Veiculo> _Veiculos;
        private IList<LinhaParada> _LinhaParadas;
        private IList<Horario> _Horarios;
        private IList<UsuarioLinha> _LinhaUsuarios;
        #endregion
        
        #region Propriedades
        [DataMember]
        [Id(Name = "Id", Column = "PK_IdLinha")]
        [Generator(1, Class = "native")]
        public virtual int Id
        {
            get { return id; }
            set { id = value; }
        }

        [DataMember]
        [Property(Column="LIN_Numero")]
        public virtual string Numero
        {
            get { return numero; }
            set { numero = value; }
        }

        [DataMember]
        [Property(Column="LIN_Nome")]
        public virtual string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        [Bag(0, Fetch = CollectionFetchMode.Select)]
        [Key(1, Column = "FK_IdLinha")]
        [OneToMany(2, ClassType = typeof(Veiculo))]
        public virtual IList<Veiculo> Veiculos
        {
            get { return _Veiculos; }
            set { _Veiculos = value; }
        }

        public virtual void AddVeiculo(Veiculo veiculo)
        {
            veiculo.Linha = this;
            this._Veiculos.Add(veiculo);
        }

        [Bag(0, Fetch = CollectionFetchMode.Select, Cascade = "all-delete-orphan", Inverse=true)]
        [Key(1, Column = "FK_IdLinha")]
        [OneToMany(2, ClassType = typeof(LinhaParada))]
        public virtual IList<LinhaParada> LinhaParadas
        {
            get { return _LinhaParadas; }
            set { _LinhaParadas = value; }
        }

        public virtual void AddLinhaParadas(LinhaParada linhaParadas)
        {
            linhaParadas.Linha = this;
            this._LinhaParadas.Add(linhaParadas);
        }

        [Bag(0, Fetch = CollectionFetchMode.Join, Cascade = "all-delete-orphan", Inverse = true)]
        [Key(1, Column = "FK_IdLinha")]
        [OneToMany(2, ClassType = typeof(Horario))]
        public virtual IList<Horario> Horarios
        {
            get { return _Horarios; }
            set { _Horarios = value; }
        }

        public virtual void AddHorario(Horario horario)
        {
            horario.Linha = this;
            this._Horarios.Add(horario);
        }

        [Bag(Lazy=CollectionLazy.True)]
        [Key(1, Column = "FK_IdLinha")]
        [OneToMany(2, ClassType = typeof(UsuarioLinha))]
        public virtual IList<UsuarioLinha> LinhaUsuarios
        {
            get { return _LinhaUsuarios; }
            set { _LinhaUsuarios = value; }
        }

        public virtual void AddLinhaUsuario(UsuarioLinha linhaUsuario)
        {
            linhaUsuario.Linha = this;
            this._LinhaUsuarios.Add(linhaUsuario);
        }
        #endregion

        #region Construtores
        public Linha() 
        {

        }
        #endregion


        public override string ToString()
        {
            return this.numero + " - " + this.nome;
        }


    }
}